home *** CD-ROM | disk | FTP | other *** search
/ Power CD-ROM!! 8 / Power CD-ROM 8.iso / prgmming / oldutil / fixdsk.doc < prev    next >
Text File  |  1994-12-10  |  4KB  |  68 lines

  1.  
  2.            Fixing a Bug in the AT's ROM BIOS
  3.  
  4.               Michael J. Markowitz
  5.               Department of Math. Sciences
  6.             Loyola Univ. of Chicago
  7.                Chicago, IL    60615
  8.                  (312) 508-3567
  9.  
  10. After installing an 18MHz crystal in my AT, it scored between 8.4 and 9.4
  11. on Peter Norton's SYSINFO (SI) benchmark, i.e., it clocked in at roughly
  12. 8.5 times the speed of an IBM PC.  That's 50% faster than a standard
  13. factory-shipped AT!  But I had one problem--approximately 1 out of every
  14. 10 floppy disk accesses would result in a "Disk Read Error" and I'd see
  15. the familiar "Abort, Retry, Ignore?" prompt.  While the retry option
  16. always worked, the interruption of long batch commands began to drive me
  17. crazy.    (I had had absolutely no trouble with the floppy drive prior to
  18. installing the new crystal.)
  19.  
  20. Checking with a friend at a major software house, I found that this
  21. problem is quite common in speeded-up AT's and that most users have just
  22. learned to live with it.  I considered reinstalling the original crys-
  23. tal, but having become accustomed to "real" speed, could not quite bring
  24. myself to do it.  So suspecting that the problem was in the software--
  25. not the hardware--I began poking around in the ROM BIOS listing in the
  26. Technical Reference Manual and found what I believe is the cause of the
  27. errors.
  28.  
  29. In the handling of disk I/O requests, the INT 13h service routine goes
  30. into several timing loops while waiting for a response from the NEC
  31. floppy disk controller.  If the NEC fails to respond (via a hardware
  32. interrupt) within a certain time period, the routine "times out" and
  33. returns an error code.    One of these loops (in the WAIT_INT routine)
  34. repeats at most 256K times and would require 25 clock cycles per iter-
  35. ation if executed on an Intel 8088.  On an IBM PC running at 4.77 MHz,
  36. where each clock cycle takes 210 nanoseconds, this would represent a
  37. maximum delay of 2.09 seconds.    A comment in the AT ROM BIOS states that
  38. this loop provides a delay of 2 seconds.  It seems that the folks at IBM
  39. forgot that they were writing code for an 80286 running at 6MHz!
  40.  
  41. Although incorrectly coded, this timing loop seems barely adequate for
  42. the proper functioning of a standard AT.  Install a faster crystal,
  43. however, and it executes much more quickly, providing a delay which
  44. is often too short for the detection of a response from the (inde-
  45. pendently clocked) floppy disk controller.
  46.  
  47. It seemed to me that the simplest solution was to write a short routine
  48. which attaches itself permanently to DOS and intercepts all disk I/O
  49. requests through INT 13h (SEE *).  When activated, this routine simulates the
  50. original software interrupt, then checks to see if the BIOS routine has
  51. returned an error code.  If so, and it's a timeout error, the INT 13h (SEE *)
  52. request is repeated, otherwise control returns to the caller.  By the
  53. second request the NEC controller should have issued the expected ack-
  54. nowledgement.
  55.  
  56. Placing FIXDSK in your autoexec.bat file should completely eliminate
  57. disk access errors.  It has been tested and found to work on three
  58. different AT's, with their original ROMs and crystals ranging in speed
  59. from 16 to 18MHz.  It has not been tested with the BIOS in the new 30MB
  60. AT.
  61.  
  62. * NOTE: FIXDSK.ASM modified 12/22/85 by C. Washburn to use INT 40H instead of
  63.   13H, and to restore contents of AH when retrying. INT 40H change was based
  64.   the notion that NOTHING should get in the Fixed Disk INT 13H code path if
  65.   at all possible! INT 40H is the relocated address of the BIOS Diskette code,
  66.   after the Fixed Disk Controller ROM installs itself, and is only and exclu-
  67.   sively for Floppy I/O.
  68.